package org.alesv.common.logging.annotations.spring;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.stereotype.Component;

/**
 * Anotación usada para registrar un bean en el contexto de Spring. Es como
 * añadirlo en el applicationContext.xml.
 * 
 * @author 
 *         http://internna.blogspot.com/2007/01/one-of-questions-that-arise-time-
 *         and.html
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.PACKAGE })
@Component
public @interface Bean {

	/**
	 * Nombre del bean.
	 */
	String name() default "";

	/**
	 * Flag que indica si la carga será "lazy" o "eager".
	 */
	boolean lazy() default false;

	/**
	 * Tipo de autowire (por defecto es por nombre).
	 */
	Autowire autoWire() default Autowire.BY_NAME;

	/**
	 * Flag que indica si la factoría debe comprobar las dependencias antes de
	 * crear la instancia.
	 */
	boolean dependencyCheck() default false;

	/**
	 * Método de inicialización para el bean.
	 */
	String initMethod() default "";

	/**
	 * Método de destrucción para este bean.
	 */
	String destroyMethod() default "";

	/**
	 * Si se trata de un "factory bean", este es el método que devolverá una
	 * instancia del bean.
	 */
	String factoryMethod() default "";

	/**
	 * Scope donde se guardará el bean.
	 */
	Scope scope() default Scope.SINGLETON;

	/**
	 * Nombre del scope donde se guardará el bean.
	 */
	String scopeName() default "";
}
